Lecture 6: 生成对抗网络(GAN)

Lectured by HUNG-YI LEE (李宏毅) Recorded by Yusheng zhao(yszhao0717@gmail.com


Lecture 6: 生成对抗网络(GAN)为什么我们需要Generator?(即为什么输出需要是个分布)介绍Generative Adversarial Network(GAN)Theory behind GANTips for GANWasserstein distance(earth mover distance)WGAN网络上更多的TipsGAN for Sequence GenerationMore Generative Models用supervised learning来做图像生成Evaluation of GenerationQuality of ImageFréchet Inception Distance (FID)Conditional GenerationConditional GANLearning from Unpaired DataCycle GAN其他GAN们关于文字风格迁移任务(Text Style Transfer)


Network as Generator:

之前学到的Network都是一个function:x Network y

这个Lecture的主题是把Network看作是一个Generator,作深层使用,这个network特别的地方是输入会加上一个random的variable :网络的输入不仅有,还有Simple Distribution的分布是同时看的输出。

network怎么同时看呢?有很多不同的做法,取决于network的架构。举个栗子:是个向量,是个向量,两者直接接起来变成比较长的向量作为一个输入;或者恰好长度一样,那两者相加后当作输入。

特别的地方就是它是不固定的,所以每次都会一样,它是从一个distribution中sample(采样)出来的,这个distribution(我们自己决定)必须够简单:我们知道这个分布的式子长什么样子,比方说高斯分布(Gaussian Distribution)、均匀分布(Uniform Distribution)。随着我们sample到的不同,输出也会不同。最后得到的输出构成一个复杂的分布(Complex Distribution)。

这种可以输出一个distribution的network我们称之为Generator

 

为什么我们需要Generator?(即为什么输出需要是个分布)

以video prediction为例,按照我们之前所学过的supervised learning方法,将过去的画面帧(部分)输入Network,输出一张预测的帧(部分):会出现预测画面明显不合理的情形(network变成一个“老好人”,出现同一种输入得到多种输出的情形)——解决方法:让输出呈现一种概率的特征,或者说是输出不固定(包含多种可能)。

上图监督学习的状况,下图是generator的状况👇

因此,当我们的任务需要一些创造力(creativity)的时候(或者说是the same input has different outputs),我们需要Generator

上述两个例子二刺螈浓度过高……老师一本正经的胡说八道:)

上面简单说明了我们为什么需要一个具有generator的model,且这个model是做怎样子的任务的。

其中一个最著名的model称之为Generative Adversarial Network(GAN)

介绍Generative Adversarial Network(GAN)

GAN怎么念?——淦,完毕。

Generative Adversarial Networks(arxiv:https://arxiv.org/abs/1406.2661

GAN的动物园——收集了超过五百种的变种GAN

以Anime Face Generation为例,

2019年,用styleGAN做的二次元人物头像,https://www.gwern.net/Faces

对于两张生成的人脸图像,两个向量之间不断做内插(interpolation),可以得到两个人物之间的渐变

这个渐变可以表现为人物表情的变化,眼神方向的变化。

以上用实例说明了GAN的实际运作是如何的,以下从理论上说明为什么Generator和Discriminator的互动可以让Generator可以产生像是真正人脸的图片。


Theory behind GAN

我们训练的目标是什么?——以我们之前讲的神经网络为例,我们要定义一个loss function,用梯度下降法,不断地minimize这个loss function就行了。而在这个Generator地问题里,我们要minimize两个dscriminator的差距,如下图👇

我们从Normal Distribution(正态分布)中sample出vector丢进Generator里面,产生出一个比较复杂的distribution,这个复杂的distribution被称之为,而ground truth即真实的数据集形成另一实在的一个distribution被称之为,我们期待这两者越接近越好——这就是我们minimize的目标。

分布的布局假设如下↓

以上,我们总结这样一个式子:

其中代表之间的散度(Divergence)【我们可以想成是两个distribution之间的某种距离,divergence本身就是distribution的一种measure】

我们实际工作的目标就是:找到一组generator的参数使得按上述方法经过generator后得到的越小越好

关于散度(divergence):这里不详细介绍,课外另外补充学习。有很多种实现方法:KL divergence、JS Divergence等等

但是实际上在计算散度时,会涉及到复杂的积分(实作上可能几乎不知道怎么计算),如果我们计算散度非常困难,那么怎么找到那个理想的?——这个就是在train这种generator经常遇到的问题,而GAN以很神奇巧妙的方式,可以突破计算散度的限制。以下进行介绍👇

Sampling is good enough……

GAN要求我们只需要知道怎么从这两个分布sample东西出来,就有办法算divergence。

既然已经知道如何sample了,那么怎么计算(估算)divergence呢?——这需要Discriminator的力量,我们根据sample出来的data(分别来自)来对Discriminator进行训练,训练的目标就是当看到Real data(from )时,给比较高的分数,而看到generative data时,就给比较低的分数。https://arxiv.org/abs/1406.2661

假如把它看作是Optimization的问题,总结为以下任务:训练一个Discriminator

需要maximize的称之为Objective Function;对应的,需要minimize的称之为Loss Function

training:

Objective Function for D:

我们需要D越大越好,上面这件事情等同于一个的二分类器(binary classifier)

直观上我们可以理解,Objective Function的值(在穷举为得到最大值)和divergence相关,详细的证明参见GAN的原始论文。

我们本来的目标是要找一个generator,去minimize两个分布的divergence,而由上述的关系,我们何不妨用训练目标Objective Function:来替换原有目标,求divergence的较大值,记为,综上,我们转换任务,得:

其中the maximum objective value()和JS divergence相关。

我们可以改变(自己定义)objective function,从而衡量各种各样得divergence(散度),在文章中(F GAN),总结了许多方法,using the divergence you like.

不同的divergence,去怎样设计objective function,这篇文章都有详细的记载。

曾经有人觉得GAN没有很好的train是因为divergence没有去很好的计算,但是F GAN这篇文章说明了即使是精致的设计了divergence的近似的计算,GAN也依旧不好train……

以下介绍GAN训练的小tips。


Tips for GAN

JS divergence有什么样的问题?

因此,如果这两个分布不重叠,那JS divergence会算出来就一直是;若重合,则为0

JS divergence无法反映出的差别优劣。

如果两个分布不重叠,那么在训练中二分类器正确率几乎会达到100%,这种训练近乎无效...

所以在早期的GAN训练仿佛是一种黑魔法,如果无法实时的去检查就无法验证train的效果如何。

所以简单的而分类器无法提供有效的GAN的训练效果的反馈。以下介绍改良的替代品WGAN。

Wasserstein distance(earth mover distance)

假设两个分布:。想象下是土堆(a pile of earth)而是土堆放的目的地(target)。而平均距离(average distance)就是推土机(earth mover)把土从的距离

对于更复杂的分布情况,区间更宽些👇,把变成有无穷多种,穷举所有的“moving plan”中average distance最小的值才是Wasserstein distance,参考博客:Wasserstein GAN and the Kantorovich-Rubinstein Duality - Vincent Herrmann

使用Wasserstein distance可以反映出训练过程中两个分布之间的距离变化(优劣),而二分类器无法做到。在训练过程中,它描述了一种渐渐变化的趋势(而非突变),这种趋势体现的差异能够让我们去train我们的generator去minimize我们定义的Wasserstein distance

WGAN

定义:就是用Wasserstein distance取代JS divergenceGAN,用Wasserstein distance来评估之间的距离。

Wasserstein distance如何计算——去解答上(3)这个式子,解出来的值就是distance的数值解,注意到:这里的指的是network的输出

:表明必须是一个足够平滑的function;如果没有这个限制,关于的训练永远不会收敛,这些maximum就会趋于无穷大。文章:https://arxiv.org/abs/1701.07875

怎么去真的解(3)这个式子?又怎样去保证的平滑性?

在最初的解答中研究者做了粗糙的处理👇,这个实际上没有解这个式子,而是做了粗线条的近似计算,当然缺陷很大。

后来另外一个想法是:,来自一篇文章

以及Spectral Normalization for Generative Adversarial Networks所介绍的Spectral Normalization Keep gradient norm smaller than 1 everywhere(为了得到更好的GAN,应当参考下这篇文章)

课后问题解答

generator和discriminator通常都不会一直迭代到收敛,只迭代几次,就交换给另外一个生成器(因为时间成本);所以在实际做的时候,许多参数就会“继承”前一个generator或是对应的discriminator(这个就是理论和实做的区别),而不会重头开始训练

WGAN有很多种不同的做法,其中效果最好的就是上述提到的Spectral Normalization(SNGAN)。但是即使有WGAN,GAN依然很难train起来,GAN是以不好train而闻名的。所以我们亦可以说GAN is still challenging…

Generator和Discriminator必须“棋逢对手”,相互“对抗”,相互促进。如果其中一方没有train好,另一方也会出现停滞——双成员的正反馈。

为了能够train起来,也是需要调超参数(hyper parameter)的。

网络上更多的Tips

GAN for Sequence Generation

课程前面部分使用GAN的样例是生成(二次元)图像,而训练GAN最难的地方是要拿GAN来生成文字。

同样是Generator要去生成“以假乱真”的文字可以fool到Discriminator的程度,以调整Generator(Decoder)的参数。

而难点在于如果要用梯度下降法去train这个Decoder(目标:让Discriminator分数越大越好),实战中会发现我们根本做不到——原因在于Decoder某个参数的小小变化(偏微分),在attention机制下,分数最大的token(token取决于任务和我们的设计)没有改变,以至于Discriminator的分数也没有改变。

attention机制下的max or sample下,尽管数值有在变化而取出来的token(可能是character或字符)往往不变,导致gradient decent几近失效;而CNN中的max Pooling层下,数值是一直随着变化的,故gradient decent有效。

遇到不能用gradient decent来train的问题,我们就要当作Reinforcement Learning(RL)的问题来硬做!

恰好地,RL非常难train,GAN非常难train,导致GAN做文字生成相当困难。很长一段时间没有人能把Generator训练起来;在面对这个问题的时候,通常我们先做Pretrain(预训练)——之后会讲到。

过去没有正常的方法来train这样子的GAN,直到提出Scratch GAN,from Scratch就是不需要pretrain的意思。所以它用了什么魔法?——爆调了超参数,以及各种tips(来自google的文章enmmm)[enough hyperparameter-tuning and tips]


More Generative Models

GAN是最广泛使用而且performance也很好;以下的可以自行了解,train的难度也不遑多让。

用supervised learning来做图像生成

我们有一堆图片,每张图片用一个vector来表示,然后“硬train一发”,当然需要用到特殊的方法来安排这些训练的vectors。可参考的研究:Generative Latent Optimization (GLO)Gradient Origin Networks


Evaluation of Generation

生成器效能评估与条件式生成。

Quality of Image
Fréchet Inception Distance (FID)

来自https://arxiv.org/pdf/1706.08500.pdf

在把一张图像丢进CNN的网络的pipeline里面,可以在之前截下来(最后一层Hidden Layer的输出代表图片),画出来假设(在二维平面)长这副样子

把分布当作是高斯分布(Gaussians Distribution),但是如果要得到准确的分布——需要大量的samples(样本)也需要一点运算量

在作业里面,我们不仅看FID(smaller is better),而且还要看二次元人脸侦测出来的数目(当然越大越好)【两个指标】

Are GANs Created Equal? A Large-Scale Study

Google爆做,各式各样的GAN👇

某些种类的GAN在某些架构的network上表现较好。

也会有一种现象(问题),GAN生成的图片和训练的图片几乎一致,这不是我们的目的,所以需要侦测下real data和Generated data的相似度(复制、翻转、放大)https://arxiv.org/pdf/1511.01844.pdf

Pros and cons of GAN evaluation measures中给出了关于GAN的许多评价指标。


Conditional Generation

之前我们以生成二次元头像为例的GAN用的是unconditional generation。

Conditional GAN

以下给出的方法是错误的,为什么?这个架构完全类似于unconditional GAN,事实上在训练当中,只要generator产生图像可以fool掉discriminator就好了,那么输入的的作用完全没有体现出来。所以说,这个架构是错误的(不是我们想要的)。

以下给出正确的设计👇,来自https://arxiv.org/abs/1605.05396

为了在训练中得到高分,不仅能生产出图像可以fool掉discriminator,而且文字label和图像需要匹配上。因此我们训练所需要的数据必须是成对出现的

不过,仅仅以上面这种positive Sample或是negative sample往往是不够的,我们还需要在训练集上增加已经这样的数据对(已经产生好的数据对,但和文字label不符)【左下】,类似是penalty Item(惩罚因子)


Learning from Unpaired Data

我们可能要训练这一种网络,训练需要的数据往往成对出现,但是事实上我们的确有一堆,也有一堆,但是两者并不各个匹配成对(unpaired)

我们有没有办法在这种情况下train呢?(without labels)

风格迁移任务:无监督学习的典型,没有任何成对的数据(资料)

之前我们讲过unconditional GAN的流程,如下

将上述流程中的替换成图片的分布和的图片的分布👇

这里指出GAN可以用来寻找域的映射关系:;其中为一对(pair)数据,这种方法称之为Unsupervised Conditional Generation

对应在数据为图像上人物通常是图像风格迁移任务,譬如真人头像-->动漫头像

Cycle GAN

Cycle GAN,即循环生成对抗网络,出自发表于 ICCV17 的论文《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks》,和它的兄长Pix2Pix(均为朱大神作品)一样,用于图像风格迁移任务。

在原来的GAN里面:可以被sample的一个distribution(不一定是高斯分布)当作丢尽generator,在这个任务中,我们认为可以丢尽一张需要被风格迁移的真人人脸图像,当然还要设计几个discriminator,看到是的图就给高分,不是就给低分。

但是一般的GAN的做法显然是不够的,可能输出会产生二次元头像(discriminator会给高分)但是和输入毫无关系,这不是我们想要的。

Cycle GAN就是为了解决这个问题的一个巧妙的想法。

它要求训练两个Generator:第一个是把一张的图转换成一张的图;第二个的作用是把上的图还原上的图。经过两次转换后,输入和输出越接近越好(两张图像流形向量的距离来衡量)

两个discriminator:要看想不想真实的人脸

相较一般的GAN的优缺点:

其他GAN们

类似于Cycle GAN,用来完成风格迁移任务

以上几个都是不同的团队几乎在一样的时间(17年)提出的几乎一样的idea来完成这个任务

另外有一种GAN可以在多种风格间做转换:


关于文字风格迁移任务(Text Style Transfer)

seq2seq任务,具体实现和Cycle GAN几乎是一模一样的

其中有几个问题:

1、怎么衡量两个句子或sequence的相似度?——余弦相似度

2、关于字符的任务用Discriminator会用问题(之前提到过),怎么办?——RL硬做

一些有趣的工作:


GAN完结撒花★,°:.☆( ̄▽ ̄)/$:.°★